import axios from "axios";
import store from "@/store";
import { getNewTokenApi } from "@/api/newtoken";
import router from "@/router";

// axios.defaults.baseURL = "";
//配置网络请求的基地址
const request = axios.create({
  baseURL: "http://toutiao.itheima.net/",
});
// 添加请求拦截器
//use(请求之前调用的，请求失败调用的)
request.interceptors.request.use(
  function (config) {
    //config(对象):包含了当前请求的配置信息
    //我们可以在当前的配置信息内，添加headers参数
    //判断当前的解控请求有没有单独的配置 headers 的Authorization 字段 一个请求 字段 如果有以单独配置的headrs为准
    if (config.headers.Authorization == undefined) {
      if (store.state.token) {
        config.headers.Authorization = `Bearer ${store.state.token}`;
      }
    }
    //如果没有 就以现有的token 为准

    console.log(config);
    // 在发送请求之前做些什么
    //config 最后要return一下，如果没有return ，则本次请求就卡住了，到不了服务端
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);
//向外导出axios实例
//添加响应拦截器
//所有的接口从服务端返回的数据会先进响应拦截器
//在这里处理所有解控可能出现 401 token 过期的情况
request.interceptors.response.use(
  function (response) {
    console.log(response);
    return response;
  },
  async function (error) {
    if (error.response.status == 401) {
      //重新请求token
      let res = await getNewTokenApi();
      console.log(res);
      localStorage.setItem("token", res.data.data.token);
      //把从新请求来的token 拼接过来  并且再次请求一次 刚请求失败的接口
      let obj = {
        url: `${error.config.baseURL}${error.config.url}`,
        method: error.config.method,
        headers: {
          Authorization: `Bearer ${res.data.data.token}`,
        },
      };
      //返回一下从新请求的接口数据
      return axios(obj);
    } else {
      //token 过期 请求的接口状态码 401
      //参数错误 接口可能是500 501 503
      //接口请求超时也可能是  500
      //断网了 状态码404
      //这种情况 退出登录 返回登录页
      localStorage.clear(); //清空本地缓存
      //跳转登录页
      router.replace("/login");
    }
    //对响应错做点什么
    return Promise.reject(error);
  }
);
export default request;
